home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 1.0 beta / flock-1.0RC3.en-US.win32.exe / flock / components / flockSingleton.js < prev    next >
Text File  |  2007-10-18  |  4KB  |  155 lines

  1. // vim: ts=2 sw=2 expandtab cindent
  2. //
  3. // BEGIN FLOCK GPL
  4. // 
  5. // Copyright Flock Inc. 2005-2007
  6. // http://flock.com
  7. // 
  8. // This file may be used under the terms of of the
  9. // GNU General Public License Version 2 or later (the "GPL"),
  10. // http://www.gnu.org/licenses/gpl.html
  11. // 
  12. // Software distributed under the License is distributed on an "AS IS" basis,
  13. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  14. // for the specific language governing rights and limitations under the
  15. // License.
  16. // 
  17. // END FLOCK GPL
  18. //
  19.  
  20. function DEBUG (x) { debug ('flockSingleton: '+x+'\n'); }
  21.  
  22. const CLASS_ID = Components.ID ('{df938052-196a-429a-88b5-f72af6b56689}');
  23. const CLASS_NAME = 'Flock JavaScript Singleton Service';
  24. const CONTRACT_ID = '@flock.com/singleton;1';
  25. const INTERFACES = [
  26.   Components.interfaces.nsISupports,
  27.   Components.interfaces.nsIClassInfo,
  28.   Components.interfaces.flockISingleton
  29. ];
  30.  
  31. // ===================================================
  32. // ========== BEGIN flockSingleton class ==========
  33. // ===================================================
  34.  
  35. function flockSingleton ()
  36. {
  37.   this.mInstances = {};
  38.   this.mLoader = Components.classes['@mozilla.org/moz/jssubscript-loader;1']
  39.     .getService(Components.interfaces.mozIJSSubScriptLoader);
  40. }
  41.  
  42. // BEGIN nsISupports interface
  43. flockSingleton.prototype.QueryInterface =
  44. function flockSingleton_QueryInterface (aIID)
  45. {
  46.   var interfaces = INTERFACES;
  47.   for (var i in interfaces) {
  48.     if (aIID.equals (interfaces[i])) {
  49.       return this;
  50.     }
  51.   }
  52.   throw Components.results.NS_ERROR_NO_INTERFACE;
  53. }
  54. // END nsISupports interface
  55.  
  56.  
  57. // BEGIN nsIClassInfo interface
  58. flockSingleton.prototype.contractID = CONTRACT_ID;
  59. flockSingleton.prototype.classID = CLASS_ID;
  60. flockSingleton.prototype.classDescription = CLASS_NAME;
  61. flockSingleton.prototype.implementationLanguage = 
  62.         Components.interfaces.nsIProgrammingLanguage.JAVASCRIPT;
  63. flockSingleton.prototype.flags = Components.interfaces.nsIClassInfo.SINGLETON;
  64.  
  65. flockSingleton.prototype.getInterfaces =
  66. function flockSingleton_getInterfaces (aCount)
  67. {
  68.   var interfaces = INTERFACES;
  69.   aCount.value = interfaces.length;
  70.   return interfaces;
  71. }
  72.  
  73. flockSingleton.prototype.getHelperForLanguage =
  74. function flockSingleton_getHelperForLanguage (aLanguage)
  75. {
  76.   return null;
  77. }
  78. // END nsIClassInfo interface
  79.  
  80.  
  81. // BEGIN flockISingleton interface
  82. flockSingleton.prototype.getSingleton =
  83. function flockSingleton_getSingleton (aURI)
  84. {
  85.     if (!this.mInstances[aURI]) {
  86.         // we need to load the script
  87.         var context = {};
  88.         // load the script
  89.         this.mLoader.loadSubScript (aURI, context);
  90.         // see if we should use a specific object instead of the script context
  91.         if (context.__singleton__) {
  92.             this.mInstances[aURI] = context.__singleton__;
  93.         } else {
  94.             this.mInstances[aURI] = context;
  95.         }
  96.     }
  97.     return { wrappedJSObject: this.mInstances[aURI] };
  98. }
  99. // END flockISingleton interface
  100.  
  101.  
  102. // ========== END flockSingleton class ==========
  103.  
  104.  
  105. // ========== BEGIN XPCOM Support ==========
  106.  
  107. var Module = {
  108.   _firstTime: true,
  109.   registerSelf: function (aCompMgr, aFileSpec, aLocation, aType)
  110.   {
  111.     if (this._firstTime) {
  112.       this._firstTime = false;
  113.       throw Components.results.NS_ERROR_FACTORY_REGISTER_AGAIN;
  114.     }
  115.     aCompMgr = aCompMgr.QueryInterface (Components.interfaces.nsIComponentRegistrar);
  116.     aCompMgr.registerFactoryLocation (CLASS_ID, CLASS_NAME, CONTRACT_ID, aFileSpec, aLocation, aType);
  117.   },
  118.  
  119.   unregisterSelf: function (aCompMgr, aLocation, aType)
  120.   {
  121.     aCompMgr = aCompMgr.QueryInterface (Components.interfaces.nsIComponentRegistrar);
  122.     aCompMgr.unregisterFactoryLocation (CLASS_ID, aLocation);        
  123.   },
  124.   
  125.   getClassObject: function (aCompMgr, aCID, aIID)
  126.   {
  127.     if (!aIID.equals (Components.interfaces.nsIFactory)) {
  128.       throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  129.     }
  130.     if (aCID.equals (CLASS_ID)) {
  131.       return Factory;
  132.     }
  133.     throw Components.results.NS_ERROR_NO_INTERFACE;
  134.   },
  135.  
  136.   canUnload: function (aCompMgr) { return true; }
  137. };
  138.  
  139. var Factory = {
  140.   createInstance: function (aOuter, aIID)
  141.   {
  142.     if (aOuter != null) {
  143.       throw Components.results.NS_ERROR_NO_AGGREGATION;
  144.     }
  145.     return (new flockSingleton ()).QueryInterface (aIID);
  146.   }
  147. };
  148.  
  149. function NSGetModule (aCompMgr, aFileSpec)
  150. {
  151.   return Module;
  152. }
  153.  
  154. // ========== END XPCOM Support ==========
  155.